
var async = require('async')
var qb = require('../qb')()


// modifies `rows.columns` with manyToMany columns on select
// modifies `rows` with ids on post

// return an array of all child ids linked to this record's pk
function getIds (args, column, pk, done) {
  var str = qb.mtm.select(args, column, pk)
  args.db.client.query(str, (err, rows) => {
    if (err) return done(err)
    var result = []
    for (var i=0; i < rows.length; i++) {
      result.push(rows[i][Object.keys(rows[i])[0]])
    }
    done(err, result)
  })
}

function loopColumns (args, row, done) {
  row.ids = {}
  async.each(args.config.columns, (column, done) => {
    if (!column.manyToMany) return done()

    // after select this column practically doesn't exists
    if (row.columns[column.name] === undefined)
      row.columns[column.name] = []

    var pk = row.pk || row.columns['__pk']
    if (!pk) return done()

    getIds(args, column, pk, (err, ids) => {
      if (err) return done(err)
      args.post
        // save the ids from the database
        ? row.ids[column.name] = ids
        // selecting
        : row.columns[column.name] = ids

      done()
    })
  }, done)
}

// loopRecords
exports.get = (args, rows, done) => {
  async.each(rows, (row, done) => {
    loopColumns(args, row, done)
  }, done)
}
